// 泛型接口

/*
{
  code:666,
  msg:'',
  data:{
    id:1,
    name:'jack'
  }
}
  */

/* 
{
  code:666,
  msg:'',
  data:{
    title:'xxxxx',
    count:56
  }
}
*/

//<T> 泛型参数
// interface ResData<T> {}

interface ResData<T> {
  code:number,
  msg:string,
  data:T
}

// 定义具体类型
interface User {
  name:string,
  age:number
}

interface  Goods {
  id:number,
  goodName:string
}

// 使用泛型并传入具体类型

let userData:ResData<User> = {
  code:666,
  msg:'xxxxxxxxxxxxx',
  data:{
    name:'jack',
    age:18
  }
}


let goodsData:ResData<Goods> = {
  code:666,
  msg:'xxxxxxxxxxxxx',
  data:{
    id:1,
    goodName:'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
  }
}



// type 写法   , 泛型 别名
// type ResData<T> = {}


type ResDa<T> = {
  code:number,
  msg:string,
  data:T
}


type Usr = {
  name:string,
  age:number
}

let UsrData:ResDa<Usr> = {
  code:666,
  msg:'xxxxxxxxxxxxx',
  data:{
    name:'jack',
    age:18
  }
}


//  ----------------------------


// 泛型函数
// 在函数名称后面使用<T>  --->  泛型参数
// function fn<T>(){}

function createArr<T>(length:number , value:T){
  let result = []
  for(let i = 0 ; i < length ; i++){
    result[i] = value
  }
  return result
}


createArr<number>(4,666)
createArr<string>(4,'999')



// 泛型约束
// 灵活  不确定性 

function logLength<T>(obj:T){
  console.log(obj.length);
}

// 添加约束
// 定义接口

interface lengthObj {
  length :number
}

function logLen<T extends lengthObj>(obj:T){
  console.log(obj.length);
  // length....
  // for()
}

// length  自己有 和 手动实现  都有效

logLen({length:7})

// console.log(['1'].length);
logLen(['1']) // arr.length

logLen(100)


// 练习

// 记录当前页面的刷新次数和刷新时的时间，每次刷新都自动自增一次，并显示到页面中，要求用TypeScript实现

// HTML渲染

// 刷新次数为:1 , 刷新的时间是: 2023-04-01 09:09:09
// 刷新次数为:1 , 刷新的时间是: 2023-04-01 09:09:10
// 刷新次数为:1 , 刷新的时间是: 2023-04-01 09:09:11 


// 思路: 假的,本地数据即可

// 从本地读出最新数据
// 取出最后一条
// 次数+1,再存回数据的尾部
// 渲染最新数据
// 保存最新数据